package com.desay.pangoo.itmt.service;

import com.desay.pangoo.itmt.controller.vo.rag.req.VoteMessageReqVo;
import com.desay.pangoo.itmt.controller.vo.rag.req.UpdateChatTitleReqVo;
import com.desay.pangoo.itmt.controller.vo.rag.req.UpdateMessageContentReqVo;
import com.desay.pangoo.itmt.controller.vo.rag.resp.ChatRespVo;
import com.desay.pangoo.itmt.controller.vo.rag.resp.HistoryRespVo;
import com.desay.pangoo.itmt.controller.vo.rag.resp.HotProblemVo;
import com.desay.pangoo.itmt.controller.vo.rag.req.MessageReqVo;
import org.springframework.http.ResponseEntity;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import java.util.List;

/**
 * RAG AI智能问答模块
 * @author uids1175
 */
public interface AIChatService {

    /**
     * 获取用户的全部聊天会话
     * @param userId 用户Id
     * @return 该用户全部的聊天会话
     */
    List<ChatRespVo> listChats(String userId);

    /**
     * 创建新的聊天会话
     * @param userId 用户Id
     * @return 新建的会话信息
     */
    ChatRespVo createNewChat(String userId);


    /**
     * 根据chatId获取该会话下的聊天记录
     * @param chatId 会话Id
     * @return 该会话下的全部历史信息
     */
    HistoryRespVo listMessagesByChatId(Long chatId);

    /**
     * 对接算法端返回的流式数据
     * @param historyMessages 算法端需要的上下文消息列表
     * @param chatId 会话Id
     * @return Ai回答的内容，流式返回
     */
    ResponseEntity<StreamingResponseBody> aiCompletion(List<MessageReqVo> historyMessages, Long chatId,String lang);

    ResponseEntity<StreamingResponseBody> aiSummary(MessageReqVo message, Long chatId,String lang);

    /**
     * 获取前10个热度最高的问题。
     * @return 热度问题列表
     */
    List<HotProblemVo> getTop10HotProblem();


    /**
     * 保存vote的状态以及对应的评论
     * @param code 1为点赞，-1点踩 0未操作/重置
     * @param messageId  需要修改状态的消息Id
     * @param comment  对应的消息备注
     */
    void saveVoteStatusAndComment(Integer code,Long messageId,String comment);


    /**
     * 根据ChatId清空历史消息
     */
    void clearHistoryMessage(Long chatId);

    /**
     * 根据消息Id更新消息的内容
     */
    void updateAiMessageContent(UpdateMessageContentReqVo reqVo);


    /**
     * 根据chatId修改聊天会话标题
     * @param reqVo 参数实体对象
     */
    void updateChatTitle(UpdateChatTitleReqVo reqVo);

    /**
     * 根据chatId删除聊天会话
     * @param chatId 聊天会话Id
     */
    void deleteChatById(Long chatId);

    /**
     * 根据MessageId删除某条消息 逻辑删除
     */
    void deleteMessageById(Long messageId);


}
